home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / esc.jar / com / extensibility / rock / FileLoader.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-06-30  |  6.2 KB  |  279 lines

  1. package com.extensibility.rock;
  2.  
  3. import java.io.BufferedInputStream;
  4. import java.io.ByteArrayOutputStream;
  5. import java.io.DataInputStream;
  6. import java.io.File;
  7. import java.io.FileInputStream;
  8. import java.io.FilterInputStream;
  9. import java.io.IOException;
  10. import java.io.OutputStream;
  11. import java.util.Enumeration;
  12. import java.util.Hashtable;
  13. import java.util.Vector;
  14. import java.util.zip.ZipEntry;
  15. import java.util.zip.ZipFile;
  16. import java.util.zip.ZipInputStream;
  17.  
  18. public class FileLoader extends ClassLoader {
  19.    private Hashtable classToFile;
  20.    private boolean cancelled;
  21.    File orgFile;
  22.    File nextFileLoc;
  23.    String orgClass;
  24.    String rootDir;
  25.    UserLocator locator;
  26.  
  27.    public FileLoader(File var1) {
  28.       this.classToFile = new Hashtable();
  29.       this.orgFile = var1;
  30.       this.nextFileLoc = var1;
  31.    }
  32.  
  33.    private String getOrgFile() {
  34.       return this.orgFile.getPath();
  35.    }
  36.  
  37.    private String getOrgFileDir() {
  38.       return this.orgFile.isDirectory() ? this.orgFile.getPath() : this.orgFile.getParent();
  39.    }
  40.  
  41.    public FileLoader(File var1, UserLocator var2) {
  42.       this(var1);
  43.       this.locator = var2;
  44.    }
  45.  
  46.    public boolean sourceIsArchive() {
  47.       return this.isArchive(this.orgFile);
  48.    }
  49.  
  50.    public boolean sourceIsClassFile() {
  51.       return this.isClassFile(this.orgFile);
  52.    }
  53.  
  54.    private boolean isArchive(File var1) {
  55.       String var2 = var1.getPath().toLowerCase();
  56.       return var2.endsWith(".zip") || var2.endsWith(".jar");
  57.    }
  58.  
  59.    private boolean isClassFile(File var1) {
  60.       return var1.getPath().toLowerCase().endsWith(".class");
  61.    }
  62.  
  63.    public Enumeration getClasses() {
  64.       return this.getClassesFromArchive(this.orgFile);
  65.    }
  66.  
  67.    private Enumeration getClassesFromArchive(File var1) {
  68.       Vector var2 = new Vector();
  69.  
  70.       try {
  71.          ZipInputStream var3 = new ZipInputStream(new FileInputStream(var1));
  72.  
  73.          while(true) {
  74.             ZipEntry var8 = var3.getNextEntry();
  75.             if (var8 == null) {
  76.                var3.close();
  77.                return var2.elements();
  78.             }
  79.  
  80.             String var5 = var8.getName();
  81.             var5 = var5.replace('/', '.');
  82.             if (var5.endsWith(".class")) {
  83.                String var6 = strip(var5.substring(0, var5.length() - 6));
  84.                var2.addElement(var6);
  85.                this.classToFile.put(var6, var1);
  86.             }
  87.          }
  88.       } catch (IOException var7) {
  89.          Object var4 = null;
  90.          return (Enumeration)var4;
  91.       }
  92.    }
  93.  
  94.    protected byte[] loadJarBytes(File var1, String var2) throws IOException {
  95.       String var3 = String.valueOf(var2.replace('.', '/')).concat(String.valueOf(".class"));
  96.       byte[] var4 = null;
  97.       ZipFile var5 = new ZipFile(var1);
  98.       Enumeration var6 = var5.entries();
  99.  
  100.       while(var6.hasMoreElements()) {
  101.          ZipEntry var7 = (ZipEntry)var6.nextElement();
  102.          String var8 = var7.getName();
  103.          if (var8.equals(var3)) {
  104.             var4 = new byte[1024];
  105.             BufferedInputStream var9 = new BufferedInputStream(var5.getInputStream(var7));
  106.             ByteArrayOutputStream var10 = new ByteArrayOutputStream();
  107.  
  108.             int var11;
  109.             while((var11 = ((FilterInputStream)var9).read(var4)) != -1) {
  110.                var10.write(var4, 0, var11);
  111.             }
  112.  
  113.             ((FilterInputStream)var9).close();
  114.             var4 = new byte[var10.size()];
  115.             var4 = var10.toByteArray();
  116.             ((OutputStream)var10).close();
  117.             break;
  118.          }
  119.       }
  120.  
  121.       return var4;
  122.    }
  123.  
  124.    public byte[] loadBytesFromFile(File var1) throws IOException {
  125.       DataInputStream var2 = new DataInputStream(new FileInputStream(var1));
  126.       int var3 = ((FilterInputStream)var2).available();
  127.       byte[] var4 = new byte[var3];
  128.       var2.readFully(var4);
  129.       return var4;
  130.    }
  131.  
  132.    public static String strip(String var0) {
  133.       int var1 = var0.indexOf(".COM.");
  134.       int var2 = var0.indexOf(".com.");
  135.       int var3 = var0.indexOf(".org.");
  136.       int var4 = var0.indexOf(".net.");
  137.       int var5 = Math.max(var2, Math.max(var1, Math.max(var3, var4)));
  138.       return var5 >= 0 ? var0.substring(var5 + 1) : var0;
  139.    }
  140.  
  141.    public String qualifyName(File var1) {
  142.       String var2 = var1.getName().substring(0, var1.getName().indexOf(".class"));
  143.       if (var2.indexOf(46) < 0) {
  144.          String var3 = this.orgFile.getParent();
  145.          int var4 = var3.indexOf(String.valueOf(String.valueOf(File.separator).concat(String.valueOf("COM"))).concat(String.valueOf(File.separator)));
  146.          int var5 = var3.indexOf(String.valueOf(String.valueOf(File.separator).concat(String.valueOf("com"))).concat(String.valueOf(File.separator)));
  147.          int var6 = var3.indexOf(String.valueOf(String.valueOf(File.separator).concat(String.valueOf("org"))).concat(String.valueOf(File.separator)));
  148.          int var7 = var3.indexOf(String.valueOf(String.valueOf(File.separator).concat(String.valueOf("net"))).concat(String.valueOf(File.separator)));
  149.          int var8 = Math.max(var5, Math.max(var4, Math.max(var6, var7)));
  150.          if (var8 >= 0) {
  151.             String var9 = var3.substring(var8 + 1);
  152.             var9 = var9.replace(File.separatorChar, '.');
  153.             return String.valueOf(String.valueOf(var9).concat(String.valueOf('.'))).concat(String.valueOf(var2));
  154.          }
  155.       }
  156.  
  157.       return var2;
  158.    }
  159.  
  160.    public String getClassFilePath(String var1) {
  161.       if (this.rootDir != null) {
  162.          return String.valueOf(String.valueOf(this.rootDir).concat(String.valueOf(var1.replace('.', File.separatorChar)))).concat(String.valueOf(".class"));
  163.       } else {
  164.          boolean var3 = var1.indexOf(46) >= 0;
  165.          if (var3) {
  166.             String var4 = var1.substring(0, var1.lastIndexOf(46)).replace('.', File.separatorChar);
  167.             int var5 = this.getOrgFile().indexOf(var4);
  168.             if (var5 < 0) {
  169.                return null;
  170.             } else {
  171.                this.rootDir = this.getOrgFile().substring(0, var5);
  172.                return this.getClassFilePath(var1);
  173.             }
  174.          } else {
  175.             return String.valueOf(String.valueOf(String.valueOf(this.getOrgFileDir()).concat(String.valueOf(File.separatorChar))).concat(String.valueOf(var1))).concat(String.valueOf(".class"));
  176.          }
  177.       }
  178.    }
  179.  
  180.    private Class classFromKnownArchive(String var1) throws IOException {
  181.       Class var2 = null;
  182.       File var3 = (File)this.classToFile.get(var1);
  183.       if (var3 != null) {
  184.          byte[] var4 = this.loadJarBytes(var3, var1);
  185.          if (var4 != null) {
  186.             var2 = ((ClassLoader)this).defineClass((String)null, var4, 0, var4.length);
  187.          }
  188.       }
  189.  
  190.       return var2;
  191.    }
  192.  
  193.    private Class loadClassFromFile(File var1, String var2) throws IOException {
  194.       Class var3 = this.classFromKnownArchive(var2);
  195.       if (var3 != null) {
  196.          return var3;
  197.       } else {
  198.          if (var1 != null && this.isArchive(var1)) {
  199.             this.getClassesFromArchive(var1);
  200.             var3 = this.classFromKnownArchive(var2);
  201.          } else {
  202.             byte[] var4 = null;
  203.             String var5 = this.getClassFilePath(var2);
  204.             File var6 = null;
  205.             if (var5 != null) {
  206.                var6 = new File(var5);
  207.             }
  208.  
  209.             if (var6 != null && var6.exists()) {
  210.                var4 = this.loadBytesFromFile(var6);
  211.             } else if (var1 != null) {
  212.                var4 = this.loadBytesFromFile(var1);
  213.             }
  214.  
  215.             if (var4 != null) {
  216.                var3 = ((ClassLoader)this).defineClass((String)null, var4, 0, var4.length);
  217.             }
  218.          }
  219.  
  220.          return var3;
  221.       }
  222.    }
  223.  
  224.    public Class loadClass(String var1, boolean var2) throws ClassNotFoundException {
  225.       Object var3 = null;
  226.  
  227.       try {
  228.          Class var12 = ((ClassLoader)this).findSystemClass(var1);
  229.          if (var12 != null) {
  230.             return var12;
  231.          }
  232.       } catch (Exception var9) {
  233.       }
  234.  
  235.       if (var1.startsWith("java.")) {
  236.          throw new ClassNotFoundException();
  237.       } else {
  238.          Class var13 = ((ClassLoader)this).findLoadedClass(var1);
  239.          if (var13 != null) {
  240.             return var13;
  241.          } else {
  242.             boolean var4 = this.orgClass == null;
  243.             if (var4) {
  244.                this.orgClass = var1;
  245.             }
  246.  
  247.             Class var5 = null;
  248.             Object var6 = null;
  249.  
  250.             try {
  251.                boolean var7 = false;
  252.                var5 = this.classFromKnownArchive(var1);
  253.  
  254.                while(var5 == null && !var7) {
  255.                   File var8 = this.nextFileLoc;
  256.                   this.nextFileLoc = null;
  257.                   var5 = this.loadClassFromFile(var8, var1);
  258.                   if (var5 == null) {
  259.                      this.nextFileLoc = this.locator.getNextLocation(var1);
  260.                      if (this.nextFileLoc == null) {
  261.                         var7 = true;
  262.                      }
  263.                   }
  264.                }
  265.  
  266.                if (var5 != null && var2) {
  267.                   ((ClassLoader)this).resolveClass(var5);
  268.                }
  269.             } catch (IOException var10) {
  270.                throw new ClassNotFoundException(var1);
  271.             } catch (Throwable var11) {
  272.             }
  273.  
  274.             return var5;
  275.          }
  276.       }
  277.    }
  278. }
  279.